/*
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 

示例：

输入：1->2->4, 1->3->4
输出：1->1->2->3->4->4

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/merge-two-sorted-lists
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。


执行用时 :12 ms, 在所有 C++ 提交中击败了35.27%的用户
内存消耗 :6.6 MB, 在所有 C++ 提交中击败了100.00%的用户

复杂度分析：
时间O(m+n),空间上只有dummy和cur指针，算O(1)

*/
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */

struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};


class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        ListNode* dummy = new ListNode(0);
        ListNode* cur = dummy;
        while (l1 && l2) {
            if (l1->val < l2->val) {
                cur->next = l1;
                cur = l1;
                l1 = l1->next;
            }
            else {
                cur->next = l2;
                cur = l2;
                l2 = l2->next;
            }
        }
        if (l2) {
            cur->next = l2;
        }
        if (l1) {
            cur->next = l1;
        }
        return dummy->next;
    }
};
void print(ListNode* head){
	ListNode* cur = head;
	while(cur){
		cout<<cur->val<<"  ";
		cur = cur->next;
	}
	cout<<endl;
}

ListNode* initListNode(int* a,int len){
	ListNode* d = new ListNode(0);
	ListNode* cur = d;
	for (int i = 0 ;i < len;i++) {
		ListNode* tmp = new ListNode(a[i]);
		cur->next = tmp;
		cur = tmp;
	}
	return d->next;
}
int main(int argc, char const* argv[]){
	int a1[3] = {2,5,9};
	int a2[4] = {8,9,11,19};
	ListNode* l1 = initListNode(a1,3);
	ListNode* l2 = initListNode(a2,4);
	
	Solution s;
	ListNode* ans  = s.mergeTwoLists(l1,l2);
	print(ans);
	return 0;
}
